/**
 * 认证相关路由
 */

const express = require('express');
const router = express.Router();
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const { db } = require('../db');

// JWT密钥
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

// 中间件：验证JWT token
const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (!token) {
    return res.status(401).json({ error: '未提供认证令牌' });
  }

  jwt.verify(token, JWT_SECRET, (err, user) => {
    if (err) {
      return res.status(403).json({ error: '无效的认证令牌' });
    }
    req.user = user;
    next();
  });
};

// 初始化管理员账户
router.post('/init-admin', async (req, res) => {
  try {
    // 检查是否已存在管理员账户
    db.get('SELECT COUNT(*) as count FROM users WHERE role = ?', ['admin'], async (err, result) => {
      if (err) {
        return res.status(500).json({ error: '数据库查询错误' });
      }

      if (result.count > 0) {
        return res.status(400).json({ error: '管理员账户已存在' });
      }

      const { username, password } = req.body;

      // 验证必需字段
      if (!username || !password) {
        return res.status(400).json({ error: '用户名和密码都是必需的' });
      }

      // 加密密码
      const hashedPassword = await bcrypt.hash(password, 10);

      // 创建管理员账户
      db.run(
        'INSERT INTO users (username, password, role) VALUES (?, ?, ?)',
        [username, hashedPassword, 'admin'],
        function(err) {
          if (err) {
            return res.status(500).json({ error: '创建管理员账户失败' });
          }
          res.json({ 
            message: '管理员账户创建成功',
            userId: this.lastID
          });
        }
      );
    });
  } catch (error) {
    res.status(500).json({ error: '服务器错误', details: error.message });
  }
});

// 登录接口
router.post('/login', (req, res) => {
  const { username, password } = req.body;

  if (!username || !password) {
    return res.status(400).json({ error: '用户名和密码都是必需的' });
  }

  db.get(
    'SELECT users.*, students.id as student_id, teachers.id as teacher_id FROM users LEFT JOIN students ON users.id = students.user_id LEFT JOIN teachers ON users.id = teachers.user_id WHERE username = ?',
    [username],
    async (err, user) => {
      if (err) {
        return res.status(500).json({ error: '数据库查询错误' });
      }

      if (!user) {
        return res.status(401).json({ error: '用户名或密码错误' });
      }

      const validPassword = await bcrypt.compare(password, user.password);
      if (!validPassword) {
        return res.status(401).json({ error: '用户名或密码错误' });
      }

      // 更新最后登录时间
      db.run('UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE id = ?', [user.id]);

      // 创建JWT token
      const token = jwt.sign(
        {
          id: user.id,
          username: user.username,
          role: user.role,
          student_id: user.student_id,
          teacher_id: user.teacher_id
        },
        JWT_SECRET,
        { expiresIn: '24h' }
      );

      res.json({
        token,
        user: {
          id: user.id,
          username: user.username,
          role: user.role,
          student_id: user.student_id,
          teacher_id: user.teacher_id
        }
      });
    }
  );
});

// 获取当前用户信息
router.get('/me', authenticateToken, (req, res) => {
  const userId = req.user.id;

  db.get(
    `SELECT 
      u.id, u.username, u.role, u.created_at, u.last_login,
      s.id as student_id, s.name as student_name, s.student_id as student_number,
      t.id as teacher_id, t.name as teacher_name, t.teacher_id as teacher_number
    FROM users u
    LEFT JOIN students s ON u.id = s.user_id
    LEFT JOIN teachers t ON u.id = t.user_id
    WHERE u.id = ?`,
    [userId],
    (err, user) => {
      if (err) {
        return res.status(500).json({ error: '数据库查询错误' });
      }

      if (!user) {
        return res.status(404).json({ error: '用户不存在' });
      }

      res.json({ user });
    }
  );
});

// 注册新用户（仅管理员可用）
router.post('/register', authenticateToken, async (req, res) => {
  // 验证是否是管理员
  if (req.user.role !== 'admin') {
    return res.status(403).json({ error: '只有管理员可以注册新用户' });
  }

  const { username, password, role, profile } = req.body;

  // 验证必需字段
  if (!username || !password || !role) {
    return res.status(400).json({ error: '用户名、密码和角色都是必需的' });
  }

  // 验证角色是否有效
  if (!['admin', 'teacher', 'student'].includes(role)) {
    return res.status(400).json({ error: '无效的角色' });
  }

  try {
    // 检查用户名是否已存在
    db.get('SELECT id FROM users WHERE username = ?', [username], async (err, existingUser) => {
      if (err) {
        return res.status(500).json({ error: '数据库查询错误' });
      }

      if (existingUser) {
        return res.status(400).json({ error: '用户名已存在' });
      }

      // 加密密码
      const hashedPassword = await bcrypt.hash(password, 10);

      // 开始事务
      db.serialize(() => {
        db.run('BEGIN TRANSACTION');

        // 插入用户记录
        db.run(
          'INSERT INTO users (username, password, role) VALUES (?, ?, ?)',
          [username, hashedPassword, role],
          function(err) {
            if (err) {
              db.run('ROLLBACK');
              return res.status(500).json({ error: '创建用户失败' });
            }

            const userId = this.lastID;

            // 根据角色插入相应的档案信息
            if (role === 'student' && profile) {
              db.run(
                `INSERT INTO students (
                  student_id, name, gender, age, class, department, major, user_id
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
                [
                  profile.student_id,
                  profile.name,
                  profile.gender,
                  profile.age,
                  profile.class,
                  profile.department,
                  profile.major,
                  userId
                ],
                (err) => {
                  if (err) {
                    db.run('ROLLBACK');
                    return res.status(500).json({ error: '创建学生档案失败' });
                  }
                  db.run('COMMIT');
                  res.json({ message: '用户注册成功', userId });
                }
              );
            } else if (role === 'teacher' && profile) {
              db.run(
                `INSERT INTO teachers (
                  teacher_id, name, gender, title, department, user_id
                ) VALUES (?, ?, ?, ?, ?, ?)`,
                [
                  profile.teacher_id,
                  profile.name,
                  profile.gender,
                  profile.title,
                  profile.department,
                  userId
                ],
                (err) => {
                  if (err) {
                    db.run('ROLLBACK');
                    return res.status(500).json({ error: '创建教师档案失败' });
                  }
                  db.run('COMMIT');
                  res.json({ message: '用户注册成功', userId });
                }
              );
            } else {
              db.run('COMMIT');
              res.json({ message: '用户注册成功', userId });
            }
          }
        );
      });
    });
  } catch (error) {
    res.status(500).json({ error: '服务器错误', details: error.message });
  }
});

// 导出认证中间件供其他路由使用
module.exports = {
  router,
  authenticateToken
};
